前面我們介紹了Data Cube、維度表和事實表的概念,今天我們用一個實際的案例來說明與比較 OLTP 和 OLAP 的轉換,也順便複習一下 MySQL 的正規化設計。
老樣子,我們用數位學習平台作為討論的案例(這個案例已做簡化與轉換,和本公司設計不同)
在數位學習平台上,學生會不定時的收到作業,並且自己可以在任意的時間開始做作業,
開始以後系統會讓學生依序作答每一個題目,直到答對所有題目,就能按下完成作業送出,
系統會自動做批改、計算得分。
為了幫助說明,我們簡化一些情境:
1. 題目只有選擇題,每一題只有四個選項。
2. 題目會有對應的科目、章節,忽略國中國小還會有冊次的資料。
3. 每份作業裡面只會有一種科目的題目,不會混出。
4. 不討論老師和班級。
ERD 描述了幾個比較核心的關係,為了簡化表達,所以沒有把屬性放進來,等等會直接呈現在資料表上。其中比較特別值得討論的是『作答記錄』,這個設計比較複雜,可以把作答記錄視為一個實體,也可以作為一個三元關係,沒有標準答案。
完成 ERD以後,轉換成關聯式的資料表,順便複習一下轉換的邏輯:
這邊圖避免混亂,我就先不加上外部鍵了。
以上面轉換後的關聯式資料表,可以滿足平台提供給使用者大多數的服務,設計的好其實也沒有太大效能的問題:
1.『作業-題目』的資料表:可以撈取每一份作業裡面包含哪些題目、包含幾題。
2.『作答記錄』:可以統計每一份作業,每位學生的作答狀況
但有些情境的JOIN 就會比較複雜,例如:學生在每個科目的作業平均正確率
撈的步驟大概是這樣(本來把SQL寫出來了,但太長了我想你也不會看,還是換成人話好了)
是不是看完就覺得非常複雜,光是資料表之間的邏輯就令人頭昏腦脹,更不用討論還有很多 SQL的語法,計算邏輯有誤區要小心。
這邊做了幾個轉換:
針對『作業題目維度表』,有幾個可以討論的點:
我們再回頭看一次剛剛的問題『學生在每個科目的作業平均正確率』,就會發現我們只需要從『作答記錄事實表』去JOIN 『作業題目維度表』以及『學生維度表』,再做統計計算,就能完成統計了。
今天從需求描述畫成 ERD ,然後轉成OLTP 的關聯式資料表,再進一步轉成 OLAP的 Data Cube,應該不難發現將資料表去正規化以後,能夠幫助業務、產品經理這些非數據、技術背景的夥伴,更專注在資料分析與找出價值本身,不會被很多煩雜的技術細節分心。
這也是為什麼我想多花幾天的篇幅,來深入聊聊 OLAP 的資料表設計技術,到底對於讓一個組織開始使用資料決策,能帶來多大的幫助。